package it.orma.iridehr.service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import it.orma.iridehr.controllers.form.candidato.NoteForm;
import it.orma.iridehr.controllers.ricerca.AttitudiniForm;
import it.orma.iridehr.entities.*;
import it.orma.iridehr.repository.CandidatoRepository;
import it.orma.iridehr.repository.NewsRepository;
import it.orma.iridehr.repository.RicercaRepository;
import it.orma.iridehr.services.helper.RisultatoRicerca;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

//import com.sanpaoloimi.rag.ragagent.dao.RisultatiCPCC_BDAO;

@Transactional
public class CandidatoService {

	static final Logger logger = LogManager.getLogger(CandidatoService.class);

	@Autowired
	private CandidatoRepository candidatoRepository;
	
	@Autowired
	private NewsRepository newsRepository;
	
	@Autowired
	private AlfrescoService alfService;
	
	@Autowired
	private RicercaRepository ricercaRepository;

	@Transactional
	public Boolean salvaDatiGenerali(DatiGenerali datiGenerali,Boolean fromAlfresco){
		if (datiGenerali.getSchedaCandidato().getIdSchedaCandidato()==null){	
			
			Users user = new Users();
			String password = candidatoRepository.creaNuovaPassword();
			user.setPassword(password);
			
			candidatoRepository.creaNuovoCandidato(datiGenerali,user);
			
			candidatoRepository.salvaDatiGenerali(datiGenerali);
			
			List<DomandaAttitudinale> domande = ricercaRepository.caricaDomandeRisposte();
			Iterator<DomandaAttitudinale> domandeIt = domande.iterator();
			List<Attitudine> attitudini = new ArrayList<Attitudine>();
			while (domandeIt.hasNext()){
				DomandaAttitudinale domanda = domandeIt.next();
				Attitudine att = new Attitudine();
				att.setIdCandidato(datiGenerali.getSchedaCandidato().getIdSchedaCandidato());
				att.setIdDomanda(domanda.getIdDomanda());
				att.setIdRispostaMeglio(new Long(-1));
				att.setIdRispostaPeggio(new Long(-1));
				att.setDataCreazione(new Date());
				attitudini.add(att);
			
			}
			candidatoRepository.creaDomandeAttitudinali(attitudini);
			
			if (datiGenerali.getIdNews()!=null&&datiGenerali.getIdNews()>-1){
				newsRepository.associaOpportunita(datiGenerali.getSchedaCandidato().getIdSchedaCandidato(),datiGenerali.getIdNews());
				newsRepository.gestisciNews(datiGenerali.getIdNews());
			}
			else if (fromAlfresco!= null && !fromAlfresco){
				News news = new News();
				news.setEmail(datiGenerali.getMail1());
				news.setDataCreazione(new Date());
				news.setDataModifica(new Date());
				news.setGestito("S");
				news.setVisibile("S");
				news.setMailInviata("N");
				news.setOpportunita(null);
				newsRepository.insertNews(news);
			}
			
			if (fromAlfresco!= null && fromAlfresco){
				List<RisultatoRicerca> ricerca = alfService.ricercaCandidatoSuAlfresco(datiGenerali.getMail1(),"CV");
				Iterator<RisultatoRicerca> ricercaIt = ricerca.iterator();
				while(ricercaIt.hasNext()){
					CVCandidato doc = new CVCandidato();
					RisultatoRicerca rRicerca = ricercaIt.next();
					doc.setIdAlfresco(rRicerca.getIdDocumento());
					doc.setTipo("CV");
					doc.setNome(rRicerca.getDettaglio());
					doc.setEstensione(rRicerca.getDettaglio().substring(rRicerca.getDettaglio().lastIndexOf(".")));
					doc.setTitolo(rRicerca.getTitle());
					doc.setIdCandidato(datiGenerali.getSchedaCandidato().getIdSchedaCandidato());
					candidatoRepository.salvaLinkAlfresco(doc);
				}
				ricerca = alfService.ricercaCandidatoSuAlfresco(datiGenerali.getMail1(),"Allegati");
				ricercaIt = ricerca.iterator();
				while(ricercaIt.hasNext()){
					CVCandidato doc = new CVCandidato();
					RisultatoRicerca rRicerca = ricercaIt.next();
					doc.setIdAlfresco(rRicerca.getIdDocumento());
					doc.setTipo("All");
					doc.setNome(rRicerca.getDettaglio());
					doc.setEstensione(rRicerca.getDettaglio().substring(rRicerca.getDettaglio().lastIndexOf(".")));
					doc.setTitolo(rRicerca.getTitle());
					doc.setIdCandidato(datiGenerali.getSchedaCandidato().getIdSchedaCandidato());
					candidatoRepository.salvaLinkAlfresco(doc);
				}
			}
			
		}else{
			candidatoRepository.salvaDatiGenerali(datiGenerali);
		}
		
		return true;
	}

	@Transactional
	public Boolean salvaTitoloDiStudio(TitoloDiStudio titoloDiStudio, StudiCompiuti studiCompiuti){
		if (titoloDiStudio.getIdTitoloDiStudio()==null){
			titoloDiStudio.setStudiCompiuti(studiCompiuti);
			titoloDiStudio.setDataCreazione(new Date());
		} else {
			titoloDiStudio.setDataModifica(new Date());
		}
		candidatoRepository.salvaTitoloDiStudio(titoloDiStudio);
		return true;


	}
	@Transactional
	public Boolean cancellaTitoloDiStudio(Long idTitoloDiStudio){
		candidatoRepository.cancellaTitoloDiStudio(idTitoloDiStudio);
		return true;
	}
	@Transactional
	public Boolean salvaStudiCompiuti(StudiCompiuti studiCompiuti){
		studiCompiuti.setDataModifica(new Date());
		candidatoRepository.salvaStudiCompiuti(studiCompiuti);
		return true;
	}

	@Transactional
	public Boolean salvaLingueConosciute(LingueConosciute lingueConosciute){
		lingueConosciute.setDataModifica(new Date());
		candidatoRepository.salvaLingueConosciute(lingueConosciute);
		return true;
	}

	@Transactional
	public Boolean salvaAltraLingua(AltraLingua altraLingua, LingueConosciute lingueConosciute){
		altraLingua.setLingueConosciute(lingueConosciute);
		candidatoRepository.salvaAltraLingua(altraLingua);
		return true;
	}

	@Transactional
	public Boolean cancellaAltraLingua(Long idAltraLingua){
		candidatoRepository.cancellaAltraLingua(idAltraLingua);
		return true;
	}

	@Transactional
	public Boolean salvaConoscenzeInformatiche(ConoscenzeInformatiche conoscenzeInformatiche){
		conoscenzeInformatiche.setDataModifica(new Date());
		candidatoRepository.salvaConoscenzeInformatiche(conoscenzeInformatiche);
		return true;
	}

	@Transactional
	public Boolean salvaAltraConoscenzaInformatica(AltraConoscenzaInformatica altraConoscenzaInformatica, ConoscenzeInformatiche conoscenzeInformatiche){
		altraConoscenzaInformatica.setConoscenzeInformatiche(conoscenzeInformatiche);
		candidatoRepository.salvaAltraConoscenzaInformatica(altraConoscenzaInformatica);
		return true;
	}
	
	@Transactional
	public Boolean salvaNote(SchedaCandidato sc, NoteForm noteForm){
		candidatoRepository.salvaNote(sc, noteForm.getNote());
		return true;
	}

	@Transactional
	public Boolean eliminaAltraConoscenzaInformatica(Long idAltraConoscenzaInformatica){
		candidatoRepository.cancellaAltraConoscenzaInformatica(idAltraConoscenzaInformatica);
		return true;
	}
	
	@Transactional
	public Boolean salvaEsperienzaLavorativa(EsperienzaLavorativa esperienzaLavorativa, SchedaCandidato schedaCandidato){
		candidatoRepository.salvaEsperienzaLavorativa(esperienzaLavorativa,schedaCandidato);
		return true;
	}
	
	@Transactional
	public Boolean cancellaEsperienzaLavorativa(Long idEsperienzaLavorativa){
		candidatoRepository.cancellaEsperienzaLavorativa(idEsperienzaLavorativa);
		return true;
	}
	
	@Transactional
	public Boolean salvaDomandeAttitudinali(AttitudiniForm form){

		candidatoRepository.salvaDomandeAttitudinali(form.getAttitudini());
		return true;
		
	}
	@Transactional
	public Boolean salvaAltreInformazioni(AltreInformazioni info, SchedaCandidato schedaCandidato){
		candidatoRepository.salvaAltreInformazioni(info, schedaCandidato);
		return true;
	}
	
	public Boolean accettaTrattamento(SchedaCandidato schedaCandidato,String loginCandidato){
		if ("userLogin".equals(loginCandidato)){
			if (schedaCandidato.getConsensoTrattamento()==0)
				return false;
		}
		return true;
	}
	
	public Boolean trattamentoAccettato(SchedaCandidato schedaCandidato){
		
		schedaCandidato.setConsensoTrattamento(1);
		candidatoRepository.trattamentoAccettato(schedaCandidato);
		return true;
		
	}
	
	@Transactional
	public Boolean aggiungiOpportunita(Long idCandidato,Long idNews){
		newsRepository.associaOpportunita(idCandidato,idNews);
		newsRepository.gestisciNews(idNews);
		return true;
	}
	
	 public Boolean saveImage(SchedaCandidato schedaCandidato,
		        MultipartFile multipartFile) {
		    DatiGenerali dg = ricercaRepository.caricaDatiGenerali(schedaCandidato);
		    try {
		        dg.setFoto(multipartFile.getBytes());
		        dg.setTipoFoto(multipartFile.getContentType());
		        multipartFile.getContentType();
		    } catch (IOException e) {
		        e.printStackTrace();
		    }
		    salvaDatiGenerali(dg,false);
		    
		    return true;

		}
	 
	 public Boolean saveAll(SchedaCandidato schedaCandidato, MultipartFile multipartFile) {
	
		 DatiGenerali dg = ricercaRepository.caricaDatiGenerali(schedaCandidato);
		    try {
		    	String name = multipartFile.getOriginalFilename();
		    	String email = dg.getMail1();
		    	String extension = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")+1);
		    	
		    	CVCandidato ultimoAll = ricercaRepository.caricaUltimoDocumento(schedaCandidato.getIdSchedaCandidato(), "All");
		    	Integer nextIndex = 1;
		    	if (ultimoAll!=null){
		    		nextIndex = Integer.parseInt(ultimoAll.getTitolo().substring(ultimoAll.getTitolo().lastIndexOf("_")+1))+1;
		    	}		    			    	
		    	String title = "All_"+email+"_"+nextIndex; 
		    	ByteArrayOutputStream baos = new ByteArrayOutputStream();
                baos.write(multipartFile.getBytes());		       
		        String alfrescoId  = alfService.storeCV(email, extension, name, title, baos,"All");
		        CVCandidato doc = new CVCandidato();
		        doc.setDataRicezione(new Date());
		        doc.setIdAlfresco(alfrescoId);
		        doc.setIdCandidato(schedaCandidato.getIdSchedaCandidato());
		        doc.setNome(name);
		        doc.setEstensione(extension);
		        doc.setTipo("All");
		        doc.setTitolo(title);
		        candidatoRepository.salvaLinkAlfresco(doc);
		        return true;
		    } catch (IOException e) {
		        e.printStackTrace();
		    }
		    return true;

		}
	 
	 public Boolean saveCV(SchedaCandidato schedaCandidato, MultipartFile multipartFile) {
			
		DatiGenerali dg = ricercaRepository.caricaDatiGenerali(schedaCandidato);
	    try {
	    	String name = multipartFile.getOriginalFilename();
	    	String email = dg.getMail1();
	    	String extension = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")+1);
	    			    	
	    	CVCandidato ultimoAll = ricercaRepository.caricaUltimoDocumento(schedaCandidato.getIdSchedaCandidato(), "CV");
	    	Integer nextIndex = 1;
	    	if (ultimoAll!=null){
	    		nextIndex = Integer.parseInt(ultimoAll.getTitolo().substring(ultimoAll.getTitolo().lastIndexOf("_")+1))+1;
	    	}
	    	String title = "CV_"+email+"_AUTO_"+(nextIndex); 
	    	ByteArrayOutputStream baos = new ByteArrayOutputStream();
            baos.write(multipartFile.getBytes());		       
	        String alfrescoId  = alfService.storeCV(email, extension, name, title, baos,"CV");
	        CVCandidato doc = new CVCandidato();
	        doc.setDataRicezione(new Date());
	        doc.setIdAlfresco(alfrescoId);
	        doc.setIdCandidato(schedaCandidato.getIdSchedaCandidato());
	        doc.setNome(name);
	        doc.setEstensione(extension);
	        doc.setTipo("CV");
	        doc.setTitolo(title);
	        candidatoRepository.salvaLinkAlfresco(doc);
	        return true;
	    } catch (IOException e) {
	        e.printStackTrace();
	    }
	    return true;

	}
}
